package com.zjx.shop.common.utils;

import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
import lombok.Data;

/**
 * 通用分页工具类
 * @author mrchai
 *
 * @param <T>
 */
@Data
public class PageUtils<T> {

    /**
     * 当前页码
     */
    private Long currentPage;
    /**
     * 每页大小
     */
    private Long pageSize;
    /**
     * 总数据条数
     */
    private Long totalNum;

    /**
     * 首页
     */
    private Long first = 1L;

    /**
     * 尾页
     */
    private Long last;
    /**
     * 总页数
     */
    private Long totalPage;

    /**
     * 上一页
     */
    private Long prev;
    /**
     * 下一页
     */
    private Long next;

    /**
     * 页面序号显示的起始位置
     */
    private Long startNum;

    /**
     * 页码显示控制-开始页码
     */
    private Long start;
    /**
     * 页码显示控制-结束页码
     */
    private Long end;
    /**
     * 显示页码控制-总显示页码（防止页码过多，页面显示拥挤问题）
     */
    private Long count = 10L;

    /**
     * 数据
     */
    private List<T> list = new ArrayList<>();

    /**
     * 在构造器中根据指定的参数，计算其他所有属性的属性值
     * @param currentPage
     * @param pageSize
     * @param totalNum
     */
    public PageUtils(Long currentPage, Long pageSize, Long totalNum, List<T> list) {

        this.list = list;

        this.currentPage = currentPage;
        //赋值每天显示的记录条数
        this.pageSize = pageSize;
        //赋值总记录数(总数据条数)
        this.totalNum = totalNum;

        //计算获得总页数以及尾页
        this.totalPage = this.last = Long.valueOf((int)Math.ceil((double)totalNum/pageSize));
        //防止当前页小于1
        this.currentPage = Math.max(this.currentPage, 1);
        //防止当前页超过总页数
        this.currentPage = Math.min(this.totalPage, this.currentPage);

        //设置上一页:上一页不能小于1
        this.prev = Math.max(this.currentPage - 1 , 1);
        //设置下一页:下一页不能超过总页数
        this.next = Math.min(this.currentPage + 1 , this.totalPage);

        //计算获取数据显示的序号位置
        this.startNum = (this.currentPage - 1) * pageSize;
        //计算显示页码的起始位置：起始位置不能小于1
        this.start = Math.max(this.currentPage - this.count/2 , 1);
        //计算显示页码的结束位置：结束位置不能超过总页数
        this.end = 	Math.min(this.start + this.count , this.totalPage);
    }
}

